package cn.elwy.osgi.config.util;

import java.io.File;
import java.net.URL;

import cn.elwy.common.util.PathUtil;
import cn.elwy.osgi.config.ConfigContext;
import cn.elwy.osgi.config.Constant;

/**
 * 主题工具类,默认不使用主题路径
 * @author huangsq
 * @version 1.0, 2013-11-20
 * @since 1.0, 2013-11-20
 */
public abstract class ThemeUtil implements Constant {

  private static String themeDir;
  private static String themePath;
  private static ThemeName themeName = ThemeName.DEFAULT;

  public static void init() {
    themePath = null;
    setThemeDir(ConfigContext.getThemeDir());
    setThemeName(ConfigContext.getThemeName());
  }

  /**
   * 获取资源文件地址，先查找USER_DIR目录，再查APP_DIR目录最后查找clazz所在组件的目录，找到其中一个直接返回，如果不存在指定的资源将返回null
   * @param clazz 所在插件的类
   * @param filePath 相对于主题的路径
   * @return
   */
  public static URL getResource(Class<?> clazz, String filePath) {
    String path = PathUtil.getFilePath(getThemePath(), filePath);
    URL resource = ResourceUtil.getResource(clazz, path);

    if (resource == null && getThemeName() != ThemeName.DEFAULT) {
      path = PathUtil.getFilePath(getDefaultThemePath(), filePath);
      resource = ResourceUtil.getResource(clazz, path);
    }
    return resource;
  }

  /**
   * 获取资源文件地址，先查找USER_DIR目录，再查APP_DIR目录最后查找clazz所在组件的目录，找到其中一个直接返回，如果不存在指定的资源将返回null
   * @param clazz 所在插件的类
   * @param filePath 相对于主题的路径
   * @return
   */
  public static File getResourceFile(Class<?> clazz, String filePath) {
    return ResourceUtil.toFile(getResource(clazz, filePath));
  }

  /**
   * 获取相对于主题目录的资源。获取相对于插件的URL资源，如果不存在指定的资源将返回null
   * @param clazz 所在插件的类
   * @param filePath 相对于主题的路径
   * @return
   */
  public static URL getBundleResource(Class<?> clazz, String filePath) {
    String path = PathUtil.getFilePath(getThemePath(), filePath);
    URL resource = ResourceUtil.getBundleResource(clazz, path);

    if (resource == null && getThemeName() != ThemeName.DEFAULT) {
      path = PathUtil.getFilePath(getDefaultThemePath(), filePath);
      resource = ResourceUtil.getBundleResource(clazz, path);
    }
    return resource;
  }

  /**
   * 获取相对于主题目录的资源。获取相对于插件的URL资源，如果不存在指定的资源将返回null
   * @param clazz 所在插件的类
   * @param filePath 相对于主题的路径
   * @return
   */
  public static File getBundleResourceFile(Class<?> clazz, String filePath) {
    return ResourceUtil.toFile(getBundleResource(clazz, filePath));
  }

  /**
   * 获取相对于主题的路径
   * @param filePath 相对于主题的路径
   * @return 相对于根目录的路径
   */
  public static String getThemeFilePath(String filePath) {
    return PathUtil.getFilePath(getThemePath(), filePath);
  }

  /**
   * 获取主题的目录
   */
  public static String getThemePath() {
    if (themePath == null) {
      themePath = PathUtil.getFilePath(themeDir, themeName.toString().toLowerCase());
    }
    return themePath;
  }

  /**
   * 获取主题的目录
   */
  public static String getDefaultThemePath() {
    if (themePath == null) {
      themePath = PathUtil.getFilePath(themeDir, ThemeName.DEFAULT.toString().toLowerCase());
    }
    return themePath;
  }

  /**
   * 获取主题目录
   */
  public static String getThemeDir() {
    return themeDir;
  }

  /**
   * 设置主题目录
   * @param themeDir 主题目录名称
   */
  public static void setThemeDir(String themeDir) {
    if (themeDir != null) {
      ThemeUtil.themeDir = themeDir;
    }
  }

  /**
   * 获取当前主题
   * @return
   */
  public static ThemeName getThemeName() {
    return themeName;
  }

  /**
   * 设置主题
   * @param themeName
   */
  public static void setThemeName(String themeName) {
    setThemeName(ThemeName.valueOf(themeName));
  }

  /**
   * 设置主题
   * @param themeName
   */
  public static void setThemeName(ThemeName themeName) {
    if (themeName != null) {
      ThemeUtil.themeName = themeName;
    }
  }

  /**
   * 主题类型
   * @author huangsq
   * @version 1.0, 2013-11-20
   * @since 1.0, 2013-11-20
   */
  public enum ThemeName {
    DEFAULT, BLUE, GRAY, DARK, RED, BRIGHT;

    public ThemeName getEnumType(String type) {
      return valueOf(type.toUpperCase());
    }

    public int getEnumIndex(String type) {
      return getEnumType(type).ordinal();
    }

  }

}
